perm filename MKVIC.FAI[GEO,BGB] blob sn#013384 filedate 1972-11-21 generic text, type T, neo UTF8
00100	TITLE	MKVIC  -  MAKE A VIDEO INTENSITY CONTOUR  -  AUGUST 1972.
00200	
00300	COMMENT/
00400	MEMORY:
00500		TVBUF		216 lines of 288 columns.
00600		PAC
00700		HSEG
00800		VSEG
00900	
01000	PROCESS:
01100	
01200		MKIMAGE		lo, hi, del or vector of thresholds.
01300		THRESHOLD	Generate 1-bit Image.
01400		PACXOR		Rook's move exclusive OR'ing.
01500		MKVIC		make video intensity contours.
01600		HVCONT		contrast of contours.
01700		KLBABY		Kill baby VIC & baby criterion.
01800		MKARCS		Make Arcs - width proportional to constrast.
01900		FARCL		Fit Arcs Linear.
02000		SPLARC		Spline Arcs.
02100	
02200	/
02300	
02400		VSEG:	BLOCK =1729
02500		HSEG:	BLOCK =1736
02600		EXTERN PAC
02700		ISAVED: 0
02800	
02900	INTERN FLGSIX↔FLGSIX: -1 ;FLAG -1 FOR SIX BIT TV, 0 FOR FOUR BIT TV.
03000	INTERN VCUT↔VCUT: 14;VERTEX CONTRAST THRESHOLD.
03100	INTERN FLGXXX↔FLGXXX: 0;enable MKARCS diagonostic display.
03200	
03300	;ARC WIDTH PROPORTIONAL TO CONTRAST TABLE FOR MKARCS.
03400	ARCWID:
03500		FOR I←0,12{6.0↔}
03600		FOR I←13,17{2.0↔}
03700		FOR I←20,37{1.0↔}
03800		FOR I←40,77{0.7↔}
03900		0
     

00100	;PACXOR - MKVIC INITIALIZATION.
00200	SUBR(PACXOR)
00300	BEGIN PACXOR
00400		I←2
00500		SLAPZ PAC↔LIM HSEG↔BLT HSEG+=1727
00600		SLAPZ PAC↔LIM VSEG↔BLT VSEG+=1727
00700		SETZ I,
00800		LAP PAC↔DAP L+2
00900	L:	TRNN I,7↔SETZ 1,↔LAC PAC(I)
01000		XORM HSEG+8(I)	; HSEG bits are above PAC bits.
01100		ROTC -1↔ROT 1,1
01200		XORM VSEG(I)	; VSEG are left of PAC bits.
01300		AOS I
01400		CAIE I,=1728
01500		GO L
01600		SETZM ISAVED
01700		RET0
01800	BEND
01900	
02000	
02100	; RPEV - LINK NAMES.
02200	
02300		DEFINE CW (A,Q){CAR A,1(Q)} ↔ DEFINE CCW (A,Q){CDR A,1(Q)}
02400		DEFINE CW.(A,Q){DIP A,1(Q)} ↔ DEFINE CCW.(A,Q){DAP A,1(Q)}
02500		DEFINE ARC(A,Q){CDR A,0(Q)} ↔ DEFINE ARC.(A,Q){DAP A,0(Q)}
02600		DEFINE ROW(A,Q){CAR A,-1(Q)}↔DEFINE COL(A,Q){CDR A,-1(Q)}
02700	
02800	; ROW-COL FIXED POINT 0000.00 OPERATIONS.
02900		OPDEF FLO[FSC 225]
     

00100	;CHEAP AD HOC DYNAMIC FREE STORAGE ROUTINES.
00200		EXTERN CORGET;
00300		CORSIZ: 0
00400		NIL←777777
00500		AVAIL:	NIL
00600	; PTR ← GETBLK;
00700	GETBLK:
00800	BEGIN GETBLK
00900		ACCUMULATORS{PTR,SIZ}
01000		CDR 1,AVAIL
01100		CAIN 1,NIL↔GO L1
01200		CDR (1)↔DAP AVAIL
01300		SETZM 0(1)↔SETZM 1(1)↔SETZM 2(1)↔SETZM 3(1)
01400		MOVEI 4↔ADDM CORSIZ
01500		ADDI 1,1↔RET0
01600	;GET A BIG BLOCK FROM SAIL.
01700	L1:	LAC [XWD 2,AC2]↔BLT AC15
01800		MOVEI 3,=4096
01900		CALL CORGET
02000		GO[FATAL(NO MORE CORE.)]
02100		MOVEI NIL↔DAP (2)↔SUBI 3,4
02200	L2:	LAC 2↔ADDI 2,4↔DAP(2)↔SUBI 3,4↔JUMPN 3,L2
02300		DAP 2,AVAIL
02400		LAC [XWD AC2,2]↔BLT 15
02500		GO GETBLK
02600	BEND
02700	
02800	;RELBLK(PTR);
02900	RELBLK:
03000	BEGIN RELBLK
03100		LAC 1,ARG1↔SUBI 1,1
03200		SETZM 0(1)↔SETZM 1(1)↔SETZM 2(1)↔SETZM 3(1)
03300		LAC 2,AVAIL↔DAP 2,(1)↔DAP 1,AVAIL
03400		NIM -4↔ADDM CORSIZ
03500		RET1
03600	BEND
03700	
03800	;KLPGON(P)
03900	SUBR(KLPGON)
04000	BEGIN KLPGON
04100		ACCUMULATORS{A2,PGN,E0,Q,R}
04200		LAC PGN,ARG1
04300		CAR E0,1(PGN)
04400		CALL RELBLK,PGN
04500		DAC E0,Q
04600	L:	CCW R,Q
04700		CALL RELBLK,Q
04800		CAMN R,E0↔RET1
04900		DAC R,Q↔GO L
05000	BEND
     

00100	;THRESHOLD(CUT)  -  pre-Foonly Version.
00200	SUBR(THRESH)
00300	BEGIN THRESH
00400		EXTERN PAC,TVBUF
00500		I←13 ↔ J←14 ↔ PTR←15
00600		LAC [XWD L,2]↔BLT 11
00700		LAP 4,ARG1↔SLIMZ I,-=1728
00800		HRLZI PTR,440600  ; =36 BITS TO GO, 6 BITS PER BYTE.
00900		SKIPN FLGSIX↔ HRLZI PTR,440400  ;  4 BITS PER BYTE.
01000		LAP PTR,TVBUF
01100		LAP 7,PAC↔GO 2
01200	
01300	;ACCUMULATOR LOOP.
01400	L:	MOVEI J,=36	;2
01500		ILDB PTR	;3
01600		SUBI ;CUT	;4
01700		ROTC 1		;5
01800		SOJG J,3	;6
01900		SETCAM 1,PAC(I) ;7
02000		AOBJN I,2	;10
02100		POP1J		;11
02200	BEND
02300	
02400	SUBR(HISTOGRAM)
02500	BEGIN HISTOGRAM
02600		EXTERN TVBUF,HISTO
02700		PTR←15
02800	
02900		LAC 1,HISTO↔SETZM(1)	;CLEAR HISTOGRAM.
03000		HRLZ 1↔ADDI 1(1)↔BLT =65(1)
03100	
03200		LAC[XWD L,2]↔BLT 5
03300	
03400		HRLZI PTR,440600↔SKIPN FLGSIX
03500		HRLZI PTR,440400↔LAP PTR,TVBUF
03600		MOVEI =60368	;NUMBER OF PIXELS IN A PICTURE.
03700		ADD 3,HISTO	;HISTOGRAM POINTER.
03800		JRST 2
03900	
04000	;ACCUMULATOR LOOP.
04100	L:	ILDB 1,PTR	;2
04200		AOS 1(1)	;3
04300		SOJG 2		;4
04400		POP1J		;5
04500	BEND
     

00100	;PTR ← PIXPTR(ROW,COL)   -  COMPUTE PICTURE BYTE POINTER.
00200	SUBR(PIXPTR)
00300	BEGIN PIXPTR
00400		;AC-0 PC return address for JSP entry.
00500		;AC-1 Row argument, byte pointer value.
00600		;AC-2 Column argument.
00700		;AC-3 get clobbered.
00800		SETZ↔LAC 1,ARG2↔LAC 2,ARG1
00900	;PIXPTR+3:
01000		SKIPN FLGSIX↔JRST L
01100	;SIX BIT BYTES  -  TVBUF + ROW*48 + (COL DIV 6).
01200		IMULI 1,=48
01300		ADD 1,TVBUF
01400		IDIVI 2,6
01500		ADD  1,2
01600		HLL   1,[POINT 6,0,-1 ↔ POINT 6,0,05 ↔ POINT 6,0,11
01700			 POINT 6,0,17 ↔ POINT 6,0,23 ↔ POINT 6,0,29](3)
01800		JUMPN@↔POP2J
01900	;FOUR BIT BYTES  - TVBUF + ROW*32 + (COL DIV 9).
02000	L:	ASH 1,5
02100		ADD 1,TVBUF
02200		IDIVI 2,9
02300		ADD 1,2
02400		HLL 1,[POINT 4,0,-1 ↔ POINT 4,0,03 ↔ POINT 4,0,07
02500		       POINT 4,0,11 ↔ POINT 4,0,15 ↔ POINT 4,0,19
02600		       POINT 4,0,23 ↔ POINT 4,0,27 ↔ POINT 4,0,31]
02700		JUMPN@↔POP2J
02800	BEND
     

00100	;HVCONTRAST(PGON)  -  HORIZONTAL/VERTICAL CONTRAST.
00200	SUBR(HVCONT)
00300	BEGIN HVCONT
00400		R←1 ↔ C←2 ↔ R2←10 ↔ C2←11 ↔ E←13 ↔ V1←14 ↔ V2←15
00500	
00600	;INITIALIZATION - SETUP FIRST EDGE OF THE PGON.
00700	
00800		LAC E,ARG1 ↔ CAR E,1(E) ↔ DAC E,E0# ↔  CW V2,E
00900		LAC -1(V2)↔ADD [XWD 30,30]
01000		CAR R2,↔LSH R2,-6   ↔   CDR C2,↔LSH C2,-6
01100	
01200	;ADVANCE CCW ALONGPGON.
01300	
01400	L0:	DAC V2,V1 ↔ DAC R2,R1# ↔ DAC C2,C1# ↔ CCW V2,E
01500		LAC -1(V2)↔ADD [XWD 30,30]
01600		CAR R2,↔LSH R2,-6   ↔   CDR C2,↔LSH C2,-6
01700	
01800	;SELECT HORIZONTAL OR VERTICAL.
01900	
02000		CAMN R2,R1 ↔ JRST HORZNT
02100		CAMN C2,C1 ↔ JRST VERTCL
02200		OUTSTR[ASCIZ/HVCONT ¬HV./]
02300	L1:	CCW E,V2↔CAME E,E0↔JRST L0
02400	
02500	;VERTEX CONTRAST.
02600	L2:	NAP 0,-1(E)
02700		CCW V1,E
02800		CCW E,V1
02900		NAP 1,-1(E)
03000		SUB 1,0↔DAP 1,2(V1)
03100	
03200		NAP 1,-1(E)↔MOVMS↔MOVMS 1↔CAMG 0,1↔EXCH 0,1
03300		SETO 2,↔CAML 0,VCUT↔CAML 1,VCUT↔SETZ 2,
03400		DIP 2,2(V1)			;MARK TRANSITIONAL VERTEX.
03500	
03600		CAME E,E0↔JRST L2↔POP1J
     

00100	;HORIZONTAL CASE LEFT TO RIGHT.
00200	HORZNT:
00300		LAC R,R1
00400		LAC C,C1 ↔ LAC 5,C2
00500		CAML C,C2 ↔ EXCH C,5	;GET FAR LEFT IN C.
00600		LAC 6,C ↔ SUB 5,C	;COLUMN DIFFERENCE.
00700	
00800	;SETUP TVBUF BYTE POINTERS 1 INSIDE, 3 OUTSIDE.
00900		JSP PIXPTR+3↔LAC 3,1
01000		SUBI 1,=32 ↔ SKIPE FLGSIX ↔ SUBI 1,=16
01100		CAME 6,C1 ↔ EXCH 1,3 ↔ LAC 6,5
01200	
01300	;ACCUMULATE INTENSITIES ALONG THE EDGE.
01400		SETZB 2,4↔ILDB 1↔ADDM 2↔ILDB 3↔ADDM 4↔  SOJG 5,.-4
01500	
01600	;SET ABOVE THE TOP OR BELOW THE BOTTOM TO UTTER DARKNESS.
01700		SKIPE R2↔CAIN R2,=216↔SETZ 4,
01800	
01900	;COMPUTE AND SAVE AVERAGE INTENSITIES AND CONTRAST.
02000		IDIV 2,6↔DIP 2,2(E)	;INSIDE CCW V1 TO V2.
02100		IDIV 4,6↔DAP 4,2(E)	;OUTSIDE CW V1 TO V2.
02200		SUB 2,4↔DAP 2,-1(E)	;CONTRAST INSIDE MINUS OUTSIDE.
02300		DIP 6,-1(E)↔ JRST L1
02400	
02500	;VERTICAL CASE TOP TO BOTTOM.
02600	VERTCL:
02700		LAC C,C1 ↔ LAC R,R1 ↔ LAC 5,R2
02800		CAML R,R2 ↔ EXCH R,5	;GET UPPERMOST ROW.
02900		LAC 6,R ↔ SUB 5,R	;ROW DIFFERENCE.
03000	
03100	;SETUP TVBUF BYTE POINTERS 1 INSIDE, 3 OUTSIDE.
03200		JSP PIXPTR+3↔TLO 1,7↔LAC 3,1	;INDEXED BY AC-7.
03300		IBP 1 ↔ TLC  3,(44B5)	;FLIP 'EM.
03400		TLNN 3,(44B5)↔SOSA 3	;DECREM BYTE POINTER.
03500		TLC  3,(44B5)		;STATUS QUO ANTE.
03600		CAME 6,R1 ↔ EXCH 1,3 ↔ LAC 6,5
03700	
03800	;ACCUMULATE INTENSITIES ALONG THE EDGE.
03900		SETZB 2,4↔SETZ 7,
04000		MOVEI =32↔SKIPE FLGSIX↔MOVEI =48↔DAP .+5    ;ROW WORD WIDTH.
04100		LDB 1↔ADDM 2↔LDB 3↔ADDM 4↔ADDI 7,0↔  SOJG 5,.-5
04200	
04300	;SET BEYOND THE LEFT OR RIGHT TO UTTER DARKNESS.
04400		SKIPE C2↔CAIN C2,=288↔SETZ 4,
04500	
04600	;COMPUTE AND SAVE AVERAGE INTENSITIES AND CONTRAST.
04700		IDIV 2,6↔DIP 2,2(E)	;INSIDE CCW V1 TO V2.
04800		IDIV 4,6↔DAP 4,2(E)	;OUTSIDE CW V1 TO V2.
04900		SUB 2,4↔DAP 2,-1(E)	;CONTRAST INSIDE MINUS OUTSIDE.
05000		DIP 6,-1(E)↔  JRST L1 ↔	LIT↔VAR
05100	BEND
     

00100	; ARC CONTRAST.
00200	SUBR(ARCONT)
00300	BEGIN ARCONT
00400		ACCUMULATORS{U1,U2,V1,V2,E,E0,N}
00500	
00600		LAC E,ARG1	;FIRST EDGE OF AN ARC PGON.
00700		CAR E,1(E)
00800		DAC E,E0
00900		CW V2,E
01000	
01100	L1:	LAC V1,V2↔CCW V2,E
01200		ARC U1,V1↔ARC U2,V2
01300	
01400		SETZ↔MOVEI N,1
01500	
01600		CCW U1,U1↔ADD 2(U1)↔CCW U1,U1
01700		CAME U1,U2↔AOJA N,.-4
01800	
01900		CAR 2,0 ↔ IDIV 2,N ↔ DIP 2,2(E)
02000		CDR 0,0 ↔ IDIV 0,N ↔ DAP 0,2(E)
02100		SUB 2,0 ↔ DAP  2,-1(E)
02200	
02300		CCW E,V2↔CAME E,E0↔JRST L1
02400	
02500	;VERTEX CONTRAST.
02600	L2:	NAP 0,-1(E)↔CCW V1,E
02700		CCW E,V1↔NAP 1,-1(E)
02800		SUB 1,0↔DAP 1,2(V1)
02900	
03000		NAP 1,-1(E)↔MOVMS↔MOVMS 1
03100		CAMG 0,1↔EXCH 0,1
03200		SETO 2,↔CAML 0,VCUT↔CAML 1,VCUT↔SETZ 2,
03300		DIP 2,2(V1)			;MARK TRANSITIONAL VERTEX.
03400	
03500		CAME E,E0↔JRST L2↔POP1J
03600	BEND
     

00100	;SUBR MKARCS (ARCV1,ARCV2,DELTA)  -  FROM U1 CCW TO U2.
00200	SUBR(MKARCS)
00300	BEGIN MKARCS
00400		EXTERN DPYXXX
00500		EXTERN SQRT; CLOBBERS AC1 THRU AC4.
00600		ACCUMULATORS{D,U1,U2,V1,V2,A,B,C,S12,E,U,V}
00700		LAC V1,ARG3↔LAC V2,ARG2↔SETZM AVCNT#
00800	
00900	;CHECK FOR TRIVAIL CASE.
01000	L0:	ARC U1,V1↔ARC U2,V2
01100		CCW E,U1↔CCW 0,E↔CAMN 0,U2↔GO L3
01200	
01300	;COMPUTE NORMALIZED ARC EDGE COEFFICIENTS.
01400		ROW A,V1↔FLO A,		; A ← Y1.
01500		COL B,V2↔FLO B,		; B ← X2.
01600		COL C,V1↔FLO C,		; C ← X1.
01700		ROW D,V2↔FLO D,		; D ← Y2.
01800		LAC 1,B↔FMPR 1,A	; 1 ← X2*Y1.
01900		FSBR A,D↔FSBR B,C	; A ← Y1-Y2.   B ← X2-X1.
02000		FMPR C,D↔FSBR C,1	; C ← X1*Y2 - X2*Y1.
02100		LAC 0,A↔FMPR 0,0↔LAC 1,B↔FMPR 1,1↔FADR 1,0
02200		CALL SQRT,1↔FDVR A,1↔FDVR B,1↔FDVR C,1
02300	
     

00100	;SET 'EM UP FOR AN ARC PASS.
00200		ARC U1,V1↔ARC U2,V2
00300		SETZM DMAX#↔SETZM DMIN#
00400		SETZM VMAX#↔SETZM VMIN#
00500		SETZM MAXCON#
00600	;GO FROM U1 CCW TO U2 AND FIND THE U FURTHEST OFF THE ARC-EDGE.
00700	L1:	CCW E,U1↔CCW U1,E↔CAMN U1,U2↔GO L2
00800		COL 0,U1↔FLO 0,↔ROW 1,U1↔FLO 1,
00900		FMPR 0,A↔FMPR 1,B↔LAC D,C↔FADR D,0↔FADR D,1
01000		CAMGE D,DMIN↔GO [DAC U1,VMIN↔DAC D,DMIN↔GO .+1]
01100		CAMLE D,DMAX↔GO [DAC U1,VMAX↔DAC D,DMAX↔GO .+1]
01200	;KEEP TRACK OF MAXIMUM EDGE CONTRAST ALONG ARC.
01300		NAP 0,-1(E)↔MOVM↔CAMLE MAXCON↔DAC MAXCON↔GO L1
01400	
01500	;WHEN EXTREMA EXCEED ARCWID[MAXCON] THEN FORM ARC-POINTS.
01600	L2:	LAC U,VMIN↔LACM DMIN
01700		CAMGE DMAX↔LAC U,VMAX↔CAMGE DMAX↔LAC DMAX
01800		LAC 1,MAXCON↔CAMGE ARCWID(1)↔GO L3
01900		
02000	;OLDE ESPLIT: →CW→ V2...D...AV...E...V1 ←CCW←
02100		CALL GETBLK↔DAC 1,E
02200		CALL GETBLK↔DAC 1,V↔AOS AVCNT
02300		ARC. U,V↔ARC. V,U↔LAC -1(U)↔DAC -1(V)
02400		CW D,V2↔CCW. D,V↔CW. V,D
02500		CW. E,V↔CCW. E,V1
02600		CW. V1,E↔CCW. V,E
02700		LAC V2,V↔SKIPN FLGXXX↔GO L0
02800		SAVAC(15)↔PUSHJ P,DPYXXX↔GETAC(15)↔GO L0
02900	
03000	;ADVANCE CCW AN ARC-EDGE OR EXIT.
03100	L3:	CAMN V2,ARG2↔RET3
03200		LAC V1,V2↔CCW E,V2↔CCW V2,E↔GO L0
03300	BEND
     

00100	;PGON ← MKVIC;
00200	SUBR(MKVIC)
00300	BEGIN MKVIC
00400	
00500		ACCUMULATORS{A2,A3,RC,MASK,I,PTR,D,E,A12,V}
00600		LAC I,ISAVED
00700		CDR PTR,ARG1
00800		SLIMZ I↔LAP PAC↔DAC PACPTR#; PAC POINTER INDEXED BY I.
00900	
01000	;FIND THE ROW & COL OF THE UPPER LEFT MOST VSEG.
01100	L1:	SKIPE 1,VSEG(I)↔GO L2
01200		AOS I↔CAIE I,=1728↔GO L1
01300		SETZ 1,↔RET0;EMPTY.
01400	
01500	L2:	DAC I,ISAVED↔JFFO 1,.+1↔SLIMZ MASK,400000
01600		MOVNS 2↔LSH MASK,(2)↔MOVNS 2
01700		LAC RC,I↔ANDI RC,7↔IMULI RC,=36↔ADD RC,2	;COLUMN.
01800		LAC I↔LSH -3↔DIP RC↔LSH RC,6			;ROW.
01900	
02000	;DISTINGUISH BLOBS FROM HOLES.
02100		SETZM HOLE#
02200		TDNN MASK,@PACPTR; HOLE OR BLOB ?
02300		SETOM HOLE#;HOLE'A'COMING.
02400	
02500	;...AND HEAD SOUTH.
02600		DAC  RC,RCMIN#↔SETZM RCMAX#↔SETZ V,↔SETZM ECNT#
02700		PUSHJ P,FOLLOW↔LAC V,V0↔CCW. V,E↔CW. E,V
02800	;MAKE & RETURN VIC POLYGON.
02900		CALL GETBLK↔DAC 1,PTR
03000		LAC 1,ECNT↔SKIPE HOLE#↔MOVNS 1 ; -CNT INDICATES A HOLE.
03100		DAC 1,-1(PTR)↔CCW E,V↔DIP E,1(PTR)↔LAC 1,PTR
03200	L3:	RET0
03300	
     

00100	;THE SUB-OPERATIONS OF MKVIC.
00200	
00300	DEFINE	TRY (SEG,YES) {
00400		LAC SEG(I)↔TDZN MASK↔GO .+3↔DAC SEG(I)↔GO YES}
00500	DEFINE	LEFT	{SUBI RC,100↔ROT MASK,1↔CAIN MASK,1↔SOS I}
00600	DEFINE	RIGHT	{ADDI RC,100↔ROT MASK,-1↔SKIPG MASK↔AOS I}
00700	DEFINE	UP 	{SUB RC,[1B11]↔SUBI I,8}
00800	DEFINE	DOWN  	{ADD RC,[1B11]↔ADDI I,8}
00900	DEFINE	DEL $ (A,B){LAC D,[XWD 0$A$30,0$B$30]}
01000	
01100	;CREATE NEW EDGE AND VERTEX.
01200	TURN:	0
01300		ADD D,RC
01400		AOS 2,ECNT
01500	
01600	;VERTEX
01700		CALL GETBLK
01800		SKIPN V↔GO[DAC 1,V0#↔DAC 1,V↔GO T2]
01900		DAC 1,V↔DIP 2,(V)
02000		CCW. V,E↔CW. E,V
02100	T2:	DAC D,-1(V)
02200		CAMLE D,RCMAX
02300		GO[DAC D,RCMAX↔DAC V,V1#↔GO .+1]
02400	
02500	;EDGE
02600		CALL GETBLK
02700		DAC 1,E↔DIP 2,(E)
02800		CCW. E,V↔CW. V,E
02900		GO @TURN
     

00100	;THE ALCHEMIST OF MKVIC -
00200	;	- converts bits of lead into golden line segments.
00300	
00400	NORTH:	ADD D,[1B11]↔JSR TURN
00500	NORTH2:	LEFT↔DEL(+,-)↔	TRY HSEG,WEST
00600		RIGHT↔UP↔	TRY VSEG,NORTH2
00700		DOWN↔DEL(+,+)↔	TRY HSEG,EAST↔FATAL(NORTH)
00800	NORTH3:	JSR TURN↔LEFT
00900	NORTH4:	UP↔DEL(+,-)↔	TRY HSEG,WEST↔GO NORTH4
01000	
01100	
01200	WEST:	ADDI D,100↔JSR TURN
01300	WEST2:	CAMN RC,RCMIN↔POPJ P,;TRY FOR E.O.VIC.
01400	FOLLOW:	DEL(+,+)↔	TRY VSEG,SOUTH
01500		LEFT↔		TRY HSEG,WEST2
01600		RIGHT↔UP↔DEL(-,+)↔TRY VSEG,NORTH↔FATAL(WEST)
01700	
01800	
01900	SOUTH:	JSR TURN
02000	SOUTH2:	DOWN↔DEL(-,+)
02100		CAR RC↔CAIN =216B29↔GO EAST3
02200				TRY HSEG, EAST
02300				TRY VSEG,SOUTH2
02400		LEFT↔DEL(-,-)↔	TRY HSEG,WEST↔	FATAL(SOUTH)
02500	
02600	
02700	EAST:	JSR TURN
02800	EAST2:	RIGHT↔DEL(-,-)
02900		CDR RC↔CAIN =288B29↔GO NORTH3
03000		UP↔		TRY VSEG,NORTH
03100		DOWN↔		TRY HSEG,EAST2
03200		DEL(+,-)↔	TRY VSEG,SOUTH↔FATAL(EAST)
03300	EAST3:	JSR TURN↔UP
03400	EAST4:	RIGHT↔DEL(-,-)
03500		CDR RC↔CAIN =288B29↔GO[DOWN↔GO NORTH3]
03600				TRY VSEG,NORTH↔GO EAST4
     

00100	;MAKE PROTO ARC POLYGON USING V0 AND V1.
00200	SUBR(MKPAP)
00300		AV1←MASK↔AV2←I
00400		CALL GETBLK↔DAC 1,PTR
00500		CALL GETBLK↔DAC 1,E
00600		CALL GETBLK↔DAC 1,D
00700		CALL GETBLK↔DAC 1,AV1↔LAC 1,V0↔ARC. 1,AV1↔ARC. AV1,1
00800		LAC -1(1)↔DAC -1(AV1)
00900		CCW. E,AV1↔CW. AV1,E↔CCW. AV1,D↔CW. D,AV1
01000		CALL GETBLK↔DAC 1,AV2↔LAC 2,V1↔ARC. 2,AV2↔ARC. AV2,2
01100		LAC -1(2)↔DAC -1(AV2)
01200		CCW. D,AV2↔CW. AV2,D↔CCW. AV2,E↔CW. E,AV2
01300		DIP E,1(PTR)↔LAC 1,PTR↔RET0
01400	BEND
     

00100	;FARCL(PGON) - FIT ARCS LINEAR.
00200	SUBR(FARCL)
00300	BEGIN FARCL
00400		X←1
00500		ACCUMULATORS{Y,SX,SY,XX,YY,XY,N,E,U1,U2,V1,V2}
00600		DAC 12,AC12
00700	
00800	;Clear the Locus of all the Arc Vertices.
00900		LAC E,ARG1↔CAR E,1(E)↔DAC E,E0#
01000		CCW V1,E ↔ SETZM -1(V1)
01100		CCW E,V1 ↔ CAME E,E0↔JRST .-4
01200	
01300	;Advance along Polygon.
01400		CW V2,E
01500	L1:	LAC V1,V2↔CCW V2,E
01600		ARC U1,V1↔ARC U2,V2
01700		CW U1,U1↔CW U1,U1
01800		CW U1,U1↔CW U1,U1
01900		CW U1,U1↔CW U1,U1
02000		CCW U2,U2↔CCW U2,U2
02100		CCW U2,U2↔CCW U2,U2
02200		CCW U2,U2↔CCW U2,U2
02300	
02400	;Arc Scan Initialization.
02500		LAC [XWD SX,SY]↔SETZ SX,↔BLT N↔JRST .+3
02600	;Advance along VIC within the ARC.
02700	L2:	CCW U1,U1↔CCW U1,U1
02800	;Accumulate a Point.
02900		CDR X,-1(U1)↔FLO X,↔CAR Y,-1(U1)↔FLO Y,
03000		FAD SX,X ↔ FAD SY,Y
03100		LAC X ↔ FMP Y ↔ FAD XY,0
03200		FMP X,X ↔ FAD XX,X
03300		FMP Y,Y ↔ FAD YY,Y
03400		CAME U1,U2↔AOJA N,L2↔AOS N
     

00100	;Compute symetric least squares line coefficients.
00200	; Q ← N*XY - SY*SX.
00300	; A ← Q + SY*SY - N*YY.
00400	; B ← Q + SX*SX - N*XX.
00500	; C ← SX*YY + SY*XX - XY*(SX+SY).
00600	
00700	L3:	LAC 2,SX↔FMP 2,YY
00800		LAC 0,SY↔FMP 0,XX↔FAD 2,0
00900		LAC SX↔FAD SY↔FMP XY↔FSB 2,0↔DAC 2,CCCC#
01000	
01100		FSC N,233↔FMP XX,N↔FMP XY,N↔FMP YY,N	;all the N terms.
01200		LAC SX↔FMP SY↔FSB XY,0				;Q in XY.
01300	
01400		FMP SY,SY↔FAD SY,XY↔FSB SY,YY↔DAC SY,AAAA#
01500		FMP SX,SX↔FAD SX,XY↔FSB SX,XX↔DAC SX,BBBB#
01600	
01700		FMP SY,SY↔FMP SX,SX↔FAD SX,SY
01800		MOVSI(1.0)↔FDVR SX↔DAC QQQQ#	;PSEUDO NORMALIZATION.
01900	
02000	;Solve for the Locii where perpendiculars dropped from
02100	;the arc-edge hit the fitted line.
02200	; Q ← 1/(A*A + B*B).
02300	; D ← (B*X1 - A*Y1).
02400	; X ← (B*D - A*C)*Q.
02500	; Y ←-(A*D + B*C)*Q.
02600	
02700	L4:	ARC U1,V1
02800		CDR X,-1(U1)↔FLO X,↔CAR Y,-1(U1)↔FLO Y,
02900		FMP X,BBBB↔FMP Y,AAAA↔FSBR X,Y↔LACN Y,X		;DDDD.
03000		FMP X,BBBB↔FMP Y,AAAA
03100		LAC AAAA↔FMP CCCC↔FSBR X,↔FMPR X,QQQQ↔247040226000;FIX
03200		LAC BBBB↔FMP CCCC↔FSBR Y,↔FMPR Y,QQQQ↔247100226000
03300		DIP Y,X↔ADDM X,-1(V1)
03400	
03500		ARC U2,V2
03600		CDR X,-1(U2)↔FLO X,↔CAR Y,-1(U2)↔FLO Y,
03700		FMP X,BBBB↔FMP Y,AAAA↔FSBR X,Y↔LACN Y,X		;DDDD.
03800		FMP X,BBBB↔FMP Y,AAAA
03900		LAC AAAA↔FMP CCCC↔FSBR X,↔FMPR X,QQQQ↔247040226000;FIX
04000		LAC BBBB↔FMP CCCC↔FSBR Y,↔FMPR Y,QQQQ↔247100226000
04100		DIP Y,X↔ADDM X,-1(V2)
04200	
04300		CCW E,V2↔CAME E,E0↔JRST L1
04400		LAC 12,AC12↔POP1J
04500	BEND
     

00100	END